<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">

	<title>Editor example - Server-side processing and tab control</title>
	<link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css">
	<link rel="stylesheet" type="text/css" href="../../../TableTools/css/dataTables.tableTools.css">
	<link rel="stylesheet" type="text/css" href="../../css/dataTables.editor.css">
	<link rel="stylesheet" type="text/css" href=
	"//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css">
	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
	<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
	<style type="text/css" class="init">

	table.dataTable tr td:first-child {
		text-align: center;
	}

	table.dataTable tr td:first-child:before {
		content: "\f096"; /* fa-square-o */
		font-family: FontAwesome;
	}

	table.dataTable tr.selected td:first-child:before {
		content: "\f046"; /* fa-check-square-o */
	}

	</style>
	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script>
	<script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script>
	<script type="text/javascript" language="javascript" src="../../../TableTools/js/dataTables.tableTools.js"></script>
	<script type="text/javascript" language="javascript" src="../../js/dataTables.editor.js"></script>
	<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
	<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
	<script type="text/javascript" language="javascript" src="../resources/editor-demo.js"></script>
	<script type="text/javascript" language="javascript" class="init">



var editor; // use a global for the submit and return data rendering in the examples

$(document).ready(function() {
	editor = new $.fn.dataTable.Editor( {
		ajax: "../php/staff.php",
		table: "#example",
		fields: [ {
				label: "First name:",
				name: "first_name"
			}, {
				label: "Last name:",
				name: "last_name"
			}, {
				label: "Position:",
				name: "position"
			}, {
				label: "Office:",
				name: "office"
			}, {
				label: "Extension:",
				name: "extn"
			}, {
				label: "Start date:",
				name: "start_date",
				type: "date"
			}, {
				label: "Salary:",
				name: "salary"
			}
		]
	} );

	var editorTab = {
		tab: false,
		shift: false,
		rowIdx: -1,
		colIdx: -1
	};

	editor
		.on( 'open', function ( ev, type ) {
			if ( type === 'inline' ) {
				// Listen for a tab key event
				$(document).on( 'keydown.editor', function ( e ) {
					if ( e.keyCode === 9 ) {
						e.preventDefault();

						var cell = $('div.DTE').parent();

						editorTab.tab = true;
						editorTab.shift = e.shiftKey;
						editorTab.rowIdx = $(cell).parent().index();
						editorTab.colIdx = $(cell).index();
						editor.submit();
					}
					else {
						editorTab.tab = false;
					}
				} );
			}
		} )
		.on( 'close', function () {
			$(document).off( 'keydown.editor' );
		} )
		.on( 'submitComplete', function () {
			if ( editorTab.tab === true ) {
				// For server-side processing mode only
				table.one( 'draw', function () {
					// Was tab submitted so need to work out where to go next
					var cell = $('tr', table.table().body()).eq( editorTab.rowIdx )
						.children().eq( editorTab.colIdx );

					if ( editorTab.shift && cell.prev().length && cell.prev().index() !== 0 ) {
						// One cell to the left (skipping the first column)
						cell.prev().click();
					}
					else if ( editorTab.shift ) {
						// Up to the previous row
						cell.parent().prev().children().last(0).click();
					}
					else if ( cell.next().length ) {
						// One cell to the right
						cell.next().click();
					}
					else {
						// Down to the next row
						cell.parent().next().children().eq(1).click();
					}

					editorTab.tab = false;
				} );
			}
		} );

	// Activate an inline edit on click of a table cell
	$('#example').on( 'click', 'tbody td:not(:first-child)', function (e) {
		editor.inline( this );
	} );

	var table = $('#example').DataTable( {
		dom: "Tfrtip",
		ajax: {
			url: "../php/staff.php",
			type: "POST"
		},
		serverSide: true,
		columns: [
			{ data: null, defaultContent: '', orderable: false },
			{ data: "first_name" },
			{ data: "last_name" },
			{ data: "position" },
			{ data: "office" },
			{ data: "start_date" },
			{ data: "salary", render: $.fn.dataTable.render.number( ',', '.', 0, '$' ) }
		],
		order: [ 1, 'asc' ],
		tableTools: {
			sRowSelect: "os",
			sRowSelector: 'td:first-child',
			aButtons: [
				{ sExtends: "editor_create", editor: editor },
				{ sExtends: "editor_edit",   editor: editor },
				{ sExtends: "editor_remove", editor: editor }
			]
		}
	} );
} );



	</script>
</head>

<body class="dt-example">
	<div class="container">
		<section>
			<h1>Editor example <span>Server-side processing and tab control</span></h1>

			<div class="info">
				<p>Editor has three different Editor modes:</p>

				<ul class="markdown">
					<li>Primary editing</li>
					<li>Bubble editing</li>
					<li>Inline editing</li>
				</ul>

				<p>Inline editing, as shown in the examples in this section, is designed to allow very rapid editing of
				individual fields in a table. The most common use case is to simply click on the cell you want to edit
				and then hit return once the edit is complete. This will save the data and the row will be immediately
				updated.</p>

				<p>This example shows inline editing on all data columns in the table. The primary editing interface of
				Editor is also still available, with row selection being made available by clicking in the first
				column. In this manner you get the benefits of rapid editing as well as the ability to create, edit and
				delete full records very easily.</p>

				<p>Inline editing in Editor is activated through the use of the <a href=
				"//editor.datatables.net/reference/api/inline()"><code class="api" title=
				"Editor API method">inline()<span>E</span></code></a> API method. Simply call the method and pass in
				the cell you want to edit as the first parameter. Editor will attempt to automatically determine which
				parameter is to be edited. Alternatively, or if Editor is unable to determine the field automatically,
				use the second parameter to tell it which field to edit.</p>
			</div>

			<table id="example" class="display" cellspacing="0" width="100%">
				<thead>
					<tr>
						<th>

						<th>First name</th>
						<th>Last name</th>
						<th>Position</th>
						<th>Office</th>
						<th width="18%">Start date</th>
						<th>Salary</th>
					</tr>
				</thead>
			</table>

			<ul class="tabs">
				<li class="active">Javascript</li>
				<li>HTML</li>
				<li>CSS</li>
				<li>Ajax</li>
				<li>Server-side script</li>
			</ul>

			<div class="tabs">
				<div class="js">
					<p>The Javascript shown below is used to initialise the table shown in this
					example:</p><code class="multiline brush: js;">var editor; // use a global for the submit and return data rendering in the examples

$(document).ready(function() {
	editor = new $.fn.dataTable.Editor( {
		ajax: &quot;../php/staff.php&quot;,
		table: &quot;#example&quot;,
		fields: [ {
				label: &quot;First name:&quot;,
				name: &quot;first_name&quot;
			}, {
				label: &quot;Last name:&quot;,
				name: &quot;last_name&quot;
			}, {
				label: &quot;Position:&quot;,
				name: &quot;position&quot;
			}, {
				label: &quot;Office:&quot;,
				name: &quot;office&quot;
			}, {
				label: &quot;Extension:&quot;,
				name: &quot;extn&quot;
			}, {
				label: &quot;Start date:&quot;,
				name: &quot;start_date&quot;,
				type: &quot;date&quot;
			}, {
				label: &quot;Salary:&quot;,
				name: &quot;salary&quot;
			}
		]
	} );

	var editorTab = {
		tab: false,
		shift: false,
		rowIdx: -1,
		colIdx: -1
	};

	editor
		.on( 'open', function ( ev, type ) {
			if ( type === 'inline' ) {
				// Listen for a tab key event
				$(document).on( 'keydown.editor', function ( e ) {
					if ( e.keyCode === 9 ) {
						e.preventDefault();

						var cell = $('div.DTE').parent();

						editorTab.tab = true;
						editorTab.shift = e.shiftKey;
						editorTab.rowIdx = $(cell).parent().index();
						editorTab.colIdx = $(cell).index();
						editor.submit();
					}
					else {
						editorTab.tab = false;
					}
				} );
			}
		} )
		.on( 'close', function () {
			$(document).off( 'keydown.editor' );
		} )
		.on( 'submitComplete', function () {
			if ( editorTab.tab === true ) {
				// For server-side processing mode only
				table.one( 'draw', function () {
					// Was tab submitted so need to work out where to go next
					var cell = $('tr', table.table().body()).eq( editorTab.rowIdx )
						.children().eq( editorTab.colIdx );

					if ( editorTab.shift &amp;&amp; cell.prev().length &amp;&amp; cell.prev().index() !== 0 ) {
						// One cell to the left (skipping the first column)
						cell.prev().click();
					}
					else if ( editorTab.shift ) {
						// Up to the previous row
						cell.parent().prev().children().last(0).click();
					}
					else if ( cell.next().length ) {
						// One cell to the right
						cell.next().click();
					}
					else {
						// Down to the next row
						cell.parent().next().children().eq(1).click();
					}

					editorTab.tab = false;
				} );
			}
		} );

	// Activate an inline edit on click of a table cell
	$('#example').on( 'click', 'tbody td:not(:first-child)', function (e) {
		editor.inline( this );
	} );

	var table = $('#example').DataTable( {
		dom: &quot;Tfrtip&quot;,
		ajax: {
			url: &quot;../php/staff.php&quot;,
			type: &quot;POST&quot;
		},
		serverSide: true,
		columns: [
			{ data: null, defaultContent: '', orderable: false },
			{ data: &quot;first_name&quot; },
			{ data: &quot;last_name&quot; },
			{ data: &quot;position&quot; },
			{ data: &quot;office&quot; },
			{ data: &quot;start_date&quot; },
			{ data: &quot;salary&quot;, render: $.fn.dataTable.render.number( ',', '.', 0, '$' ) }
		],
		order: [ 1, 'asc' ],
		tableTools: {
			sRowSelect: &quot;os&quot;,
			sRowSelector: 'td:first-child',
			aButtons: [
				{ sExtends: &quot;editor_create&quot;, editor: editor },
				{ sExtends: &quot;editor_edit&quot;,   editor: editor },
				{ sExtends: &quot;editor_remove&quot;, editor: editor }
			]
		}
	} );
} );</code>

					<p>In addition to the above code, the following Javascript library files are loaded for use in this
					example:</p>

					<ul>
						<li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li>
						<li><a href=
						"../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li>
						<li><a href=
						"../../../TableTools/js/dataTables.tableTools.js">../../../TableTools/js/dataTables.tableTools.js</a></li>
						<li><a href="../../js/dataTables.editor.js">../../js/dataTables.editor.js</a></li>
					</ul>
				</div>

				<div class="table">
					<p>The HTML shown below is the raw HTML table element, before it has been enhanced by
					DataTables:</p>
				</div>

				<div class="css">
					<div>
						<p>This example uses a little bit of additional CSS beyond what is loaded from the library
						files (below), in order to correctly display the table. The additional CSS used is shown
						below:</p><code class="multiline brush: js;">table.dataTable tr td:first-child {
		text-align: center;
	}

	table.dataTable tr td:first-child:before {
		content: &quot;\f096&quot;; /* fa-square-o */
		font-family: FontAwesome;
	}

	table.dataTable tr.selected td:first-child:before {
		content: &quot;\f046&quot;; /* fa-check-square-o */
	}</code>
					</div>

					<p>The following CSS library files are loaded for use in this example to provide the styling of the
					table:</p>

					<ul>
						<li><a href=
						"../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li>
						<li><a href=
						"../../../TableTools/css/dataTables.tableTools.css">../../../TableTools/css/dataTables.tableTools.css</a></li>
						<li><a href="../../css/dataTables.editor.css">../../css/dataTables.editor.css</a></li>
						<li><a href=
						"//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css">//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css</a></li>
					</ul>
				</div>

				<div class="ajax">
					<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data
					will update automatically as any additional data is loaded.</p>
				</div>

				<div class="php">
					<p>The script used to perform the server-side processing for this table is shown below. Please note
					that this is just an example script using PHP. Server-side processing scripts can be written in any
					language, using <a href="//datatables.net/manual/server-side">the protocol described in the
					DataTables documentation</a>.</p>
				</div>
			</div>
		</section>
	</div>

	<section>
		<div class="footer">
			<div class="gradient"></div>

			<div class="liner">
				<h2>Other examples</h2>

				<div class="toc">
					<div class="toc-group">
						<h3><a href="../simple/index.html">Simple initialisation</a></h3>
						<ul class="toc">
							<li><a href="../simple/simple.html">Basic initialisation</a></li>
							<li><a href="../simple/fieldDefaults.html">Setting defaults</a></li>
							<li><a href="../simple/fieldTypes.html">Field types</a></li>
							<li><a href="../simple/dates.html">Dates (with jQuery UI datepicker)</a></li>
							<li><a href="../simple/i18n.html">Internationalisation</a></li>
							<li><a href="../simple/inTableControls.html">In table form controls</a></li>
							<li><a href="../simple/responsive.html">Responsive table extension</a></li>
							<li><a href="../simple/server-side-processing.html">Server-side processing</a></li>
							<li><a href="../simple/join.html">Join tables - working with multiple SQL tables</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../advanced/index.html">Advanced initialisation</a></h3>
						<ul class="toc">
							<li><a href="../advanced/formOnlyData.html">Data shown only in the form</a></li>
							<li><a href="../advanced/tableOnlyData.html">Data shown in table only</a></li>
							<li><a href="../advanced/deepObjects.html">Complex (nested) JSON data source</a></li>
							<li><a href="../advanced/REST.html">REST interface</a></li>
							<li><a href="../advanced/localstorage.html">Ajax override - using localStorage for the data
							source</a></li>
							<li><a href="../advanced/jsonId.html">Row ID source specification</a></li>
							<li><a href="../advanced/htmlTable.html">DOM sourced table</a></li>
							<li><a href="../advanced/exportButtons.html">Export buttons</a></li>
							<li><a href="../advanced/joinSelf.html">Join tables - self referencing join</a></li>
							<li><a href="../advanced/joinLinkTable.html">Join tables - link table</a></li>
							<li><a href="../advanced/joinArray.html">Join tables - one-to-many join</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../bubble-editing/index.html">Bubble editing</a></h3>
						<ul class="toc">
							<li><a href="../bubble-editing/simple.html">Simple bubble editing</a></li>
							<li><a href="../bubble-editing/grouped.html">Multiple fields in a bubble</a></li>
							<li><a href="../bubble-editing/options.html">Form control and display options</a></li>
							<li><a href="../bubble-editing/defaultOptions.html">Default control and display
							options</a></li>
							<li><a href="../bubble-editing/inTableControls.html">Bubble editing with in table row
							controls</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="./index.html">Inline editing</a></h3>
						<ul class="toc active">
							<li><a href="./simple.html">Simple inline editing</a></li>
							<li><a href="./tabControl.html">Tab between columns</a></li>
							<li><a href="./options.html">Editing options - submit on blur</a></li>
							<li><a href="./submitButton.html">Inline editing with a submit button</a></li>
							<li><a href="./editIcon.html">Edit icon</a></li>
							<li class="active"><a href="./server-side-processing.html">Server-side processing and tab
							control</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../api/index.html">API</a></h3>
						<ul class="toc">
							<li><a href="../api/confirmClose.html">Events - unsaved changes close confirmation</a></li>
							<li><a href="../api/clientValidation.html">Client-side validation</a></li>
							<li><a href="../api/triggerButton.html">Customised control buttons</a></li>
							<li><a href="../api/backNext.html">Previous / next editing buttons</a></li>
							<li><a href="../api/duplicateButton.html">Duplicate button</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../standalone/index.html">Standalone</a></h3>
						<ul class="toc">
							<li><a href="../standalone/simple.html">Simple standalone editing</a></li>
							<li><a href="../standalone/bubble.html">Bubble editing</a></li>
							<li><a href="../standalone/inline.html">Inline editing</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../styling/index.html">Styling</a></h3>
						<ul class="toc">
							<li><a href="../styling/envelope.html">Envelope display controller</a></li>
							<li><a href="../styling/envelopeInTable.html">Envelope display with in table
							controls</a></li>
							<li><a href="../styling/stackedInputs.html">Styled for stacked inputs</a></li>
							<li><a href="../styling/bootstrap.html">Bootstrap</a></li>
							<li><a href="../styling/jqueryui.html">jQuery UI</a></li>
						</ul>
					</div>

					<div class="toc-group">
						<h3><a href="../plug-ins/index.html">Plug-ins</a></h3>
						<ul class="toc">
							<li><a href="../plug-ins/fieldPlugin.html">Custom field type plug-ins</a></li>
							<li><a href="../plug-ins/displayController.html">Custom display controller</a></li>
						</ul>
					</div>
				</div>

				<div class="epilogue">
					<p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full
					information about its API properties and methods.<br>
					Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and
					<a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of
					DataTables.</p>

					<p class="copyright">DataTables designed and created by <a href=
					"http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br>
					DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p>
				</div>
			</div>
		</div>
	</section>
</body>
</html>